﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Sinacor.Infra.UI.Common;

namespace Sinacor.UI.Bovespa.Clientes.Presenter
{
    /// <summary>
    /// Cadastro de Tipos de Conta
    /// </summary>
    public class CadastroTipoConta : BasePresenter<ICadastroTipoConta>
    {
        #region Campos
        Communication.TipoConta _communicationTipoConta;
        Communication.Cliente _communicationCliente;
        Model.Parameter.FiltroTipoConta _filtro;
        ModelCollection<Model.TipoConta> _listaTipoConta;

        
        #endregion

        #region Propriedades
        /// <summary>
        /// Filtro de Tipos de Conta
        /// </summary>
        public Model.Parameter.FiltroTipoConta Filtro
        {
            get { return _filtro; }
            set { _filtro = value; }
        }


        /// <summary>
        /// Lista de Tipos de Conta
        /// </summary>
        public ModelCollection<Model.TipoConta> ListaTipoConta
        {
            get { return _listaTipoConta; }
            set { _listaTipoConta = value; }
        }
        #endregion

        #region Construtor
        /// <summary>
        /// Construtor de Cadastro de Tipo de Conta
        /// </summary>
        /// <param name="view"></param>
        public CadastroTipoConta(ICadastroTipoConta view)
            : base(view)
        {
            this._communicationCliente = new Communication.Cliente(this.Session);
            this._communicationTipoConta = new Communication.TipoConta(this.Session);
            this.Filtro = new Sinacor.UI.Bovespa.Clientes.Model.Parameter.FiltroTipoConta();
            this.ListaTipoConta = new ModelCollection<Model.TipoConta>();
        }
        #endregion

        #region Métodos
        /// <summary>
        /// Alterar Tipo de Conta
        /// </summary>
        /// <param name="tipoConta">Model Tipo de Conta</param>
        /// <returns>Boleano com alteração realizada com sucesso</returns>
        public bool AlterarTipoConta(Model.TipoConta tipoConta)
        {
            try
            {
                if (tipoConta.Especialista == null)
                    tipoConta.Especialista = false;
                _communicationTipoConta.AlterarTipoConta(tipoConta);
                this.View.InformarTipoContaAlteradoSucesso();
                return true;
            }
            catch (Exception ex)
            {
                HandleException(ex);
                return false;
            }
        }
        /// <summary>
        /// Consultar os Tipos de Conta
        /// </summary>
        public void ConsultarTiposConta() 
        {
            try
            {
                ListaTipoConta = _communicationTipoConta.ConsultarTiposConta(_filtro);


                if (ListaTipoConta == null || ListaTipoConta.Count == 0)
                    this.View.InformarNenhumRegistroEncontrado();

                this.View.AtualizarTipoConta();

            }
            catch (Exception ex)
            {
                HandleException(ex);
            }

        }

        /// <summary>
        /// Exclui uma lista de Tipos de Conta
        /// </summary>
        /// <param name="listaTipoConta">Lista de Tipos de Conta</param>
        /// <returns>Boleano com exclusão realizada com sucesso</returns>
        public bool ExcluirTipoConta(ModelCollection<Model.TipoConta> listaTipoConta) 
        {
            try
            {
                if (listaTipoConta == null || listaTipoConta.Count == 0)
                {
                    this.View.InformarNenhumTipoContaSelecionado();
                }
                else 
                {
                    if (this.View.ConfirmarExclusaoTipoConta())
                    {

                        ModelCollection<Model.Parameter.FiltroCodigoCliente> filtro = new ModelCollection<Sinacor.UI.Bovespa.Clientes.Model.Parameter.FiltroCodigoCliente>();
                        foreach (Model.TipoConta tipoConta in listaTipoConta)
                        {
                            filtro.Add(new Sinacor.UI.Bovespa.Clientes.Model.Parameter.FiltroCodigoCliente() { Codigo = tipoConta.CodigoCliente.Value });
                        }

                        this._communicationTipoConta.ExcluirTiposConta(filtro);
                        this.View.InformarTipoContaExcluidoSucesso();
                        return true;
                    }

                }
                return false;
            }
            catch (Exception ex) 
            {
                HandleException(ex);
                return false;
            }

            


        }

        /// <summary>
        /// Incluir Tipo de Conta
        /// </summary>
        /// <param name="tipoConta">Model de Tipos de Conta</param>
        /// <returns>Boleano com tipo de conta incluida com sucesso</returns>
        public bool IncluirTipoConta(Model.TipoConta tipoConta)
        {
            try
            {
                _communicationTipoConta.IncluirTipoConta(tipoConta);
                this.View.InformarTipoContaIncluidoSucesso();
                return true;
            }
            catch (Exception ex)
            {
                HandleException(ex);
                return false;
            }
        }

        /// <summary>
        /// Validar Cliente
        /// </summary>
        /// <param name="codigoCliente">Codigo do Cliente</param>
        /// <returns>Validação do Código do Cliente</returns>
        public bool ValidarCliente(int codigoCliente) 
        {
            try
            {
                Model.Parameter.FiltroCodigoCliente filtro = new Sinacor.UI.Bovespa.Clientes.Model.Parameter.FiltroCodigoCliente();
                filtro.Codigo = codigoCliente;

                Model.ResultadoValidacaoCliente resultadoValidacaoCliente = this._communicationCliente.ValidarExistenciaCliente(filtro);

                if (resultadoValidacaoCliente.Resultado.IsValid)
                {
                    this.View.ApresentarApelidoCliente(resultadoValidacaoCliente.ApelidoCliente);
                }
                else
                {
                    if (resultadoValidacaoCliente.Resultado.Error.ErrorNumber == 109344)
                        this.View.InformarClienteInvalido();
                    else if (resultadoValidacaoCliente.Resultado.Error.ErrorNumber == 109345)
                        this.View.InformarUsuarioNaoAcessor();

                }
                return true;
            }
            catch (Exception ex) 
            {
                HandleException(ex);
                return false;
            }

            


        }


        /// <summary>
        /// Inicializar Tela
        /// </summary>
        public void Inicializar()
        {
            this.ConsultarTiposConta();
        }

        #endregion
    }
}
